#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <pthread.h>
#include <unistd.h>
#include <memory>
#include "Thread.h"
using namespace std;

using namespace ThreadNs;

void *test(void* args)
{
    cout << "hello "<< (const char*)args << endl;
}

int main()
{

    unique_ptr<Thread> th1(new Thread(test, 1, (void*)"hello"));

    cout << th1->name() << endl;
    th1->join();

    sleep(2);

    return 0;
}

// void* routine(void* com)
// {
//     while (true)
//     {
//         cout << "我是子线程, " << (const char *)com << endl;
//         sleep(1);
//     }
// }

// struct ThreadData
// {
//     int _number;
//     pthread_t _tid;
//     char _buffer[64];

//     ThreadData(int num = 0, pthread_t tid = 0) : _number(num), _tid(tid) {}
// };

// struct ThreadReturn
// {
//     int __exit_code;
//     int __exit_result;
//     string __log;

//     ThreadReturn(int exit_code = 0, int exit_result = 0, string log = "") 
//     : __exit_code(exit_code)
//     , __exit_result(exit_result)
//     , __log(log)  
//     {}
// };

// void* start_routine(void* args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
//     int cnt = 10;
//     while (cnt)
//     {
//         cout << " cnt: " << cnt << " &cnt: " << &cnt << endl;
//         --cnt;
//         sleep(1);
//     }
//     //ThreadReturn *ret = new ThreadReturn(114, 514, "aaaaaaa");

//     return (void*)114514;
// }

// int main()
// {
//     vector<ThreadData*> threads;

//     for (int i = 0; i < 10; ++i)
//     {
//         ThreadData *td = new ThreadData(i+1);
//         snprintf(td->_buffer, sizeof(td->_buffer), "%s:%d", "thread", i + 1);
//         pthread_create(&td->_tid, nullptr, start_routine, td);
//         threads.push_back(td);
//     }

//     sleep(3);
//     for (int i = 0; i < threads.size() / 2; ++i)
//     {
//         pthread_cancel(threads[i]->_tid);
//         cout << " thread: " << threads[i]->_buffer << " succes" << endl;
//     }

//     for (auto& iter : threads)
//     {
//         void *ret = nullptr;
//         int n = pthread_join(iter->_tid, &ret);
//         assert(n == 0);

//         cout << "线程返回值 " << (long long)ret << endl;

//         delete iter;
//     }

//     return 0;
// }

// int main()
// {
//     pthread_t tid;

//     int n = pthread_create(&tid, nullptr, routine, (void *)"hello thread");
//     assert(n == 0);
//     (void)n;

//     char tidbuffer[64];
//     snprintf(tidbuffer, sizeof(tidbuffer), "0x%x", tid);

//     while (true)
//     {
//         cout << "我是主线程, 创建出来的线程id:" << tidbuffer << endl;
//         sleep(1);
//     }

//     return 0;
// }